﻿//----------------------------------------------------------------
// Desc: 计时器
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2010-06-11
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


//----------------------------------------------------------------
// 固定频率时间单步处理
//----------------------------------------------------------------
class FTimerLapse : public IFMemObject
{
    DWORD nNxtWork, nStep;

    FDECLARE_CLASS(FTimerLapse)

public:
    FDT_VALUE ud;

    FTimerLapse(bool auto_start = false, DWORD step = 1000)
    {
        if (auto_start)
            Start(step);
        else
            End();
    }
    // 启动计时器
    void Start(DWORD step)
    {
        if (step < 10)
            step = 10;
        nStep = step;
        nNxtWork = FGetTime() + nStep;
    }
    // 停止计时器
    void End()
    {
        nNxtWork = 0;
    }
    // 测试是否已经过了计时器，需要进行处理一帧（需要循环判断）
    bool NeedProcess()
    {
        if (nNxtWork == 0)
            return false;
        DWORD ntime = FGetTime();
        if (ntime < nNxtWork)
            return false;
        nNxtWork += nStep;
        return true;
    }
};


//----------------------------------------------------------------
// 测试一个过程时间流逝情况
//----------------------------------------------------------------
class FTimekeeper : public IFMemObject
{
	INT64 ustart, uend;

    FDECLARE_CLASS(FTimekeeper)

public:
    FDT_VALUE ud;

    FTimekeeper(bool auto_start)
        :ustart(0)
        ,uend(0)
    {
        if (auto_start)
            Start();
    }
    // 启动计时器
    void Start()
    {
        ustart = FGetCPUTime();
    }
    // 停止计时器
    void End()
    {
        uend = FGetCPUTime();
    }
    // 取得计时器计了多少时间（单位微秒，1000微秒=1毫秒）
    float GetLength(bool call_end)
    {
        if (call_end)
            End();
        return (uend - ustart) / 1000.0f;
    }
};
